Disqueを使って遊ぶ
概要
redis作ってた人が作ってるよ~って言ってた分散メッセージブローカーがgithubにきてた。
disque
https://github.com/antirez/disque
まだα版だよみたいな感じ。
make
依存が無いのでmakeするだけでokなはず。
OS X 10.10.3 とかでそのまま動いた。
ビルドしたバイナリはsrc中に出来る。
serverたてる
disque-server をぶったたくと起動する。
初期ポートは7711になっている。このへんはconfがついてるのでそのへんと合わせてセットみたいな感じ。
備え付けのコマンドラインインターフェースをつなぐ
disqueのserverに対して対象となるport指定でcli-clientを起動できる。
disqueのclientは複数のserverに対して通信をすることができる。(multi-masterってこの事か
コマンドの単位とかなんかまだ変わりそうな気がする。
addjob queueName messageBody 0
で、addjobでqueueNameという名称のキューに対してmessageBodyというメッセージを送っている。 最後の0は timeout。
getjob from queueName
で、queueNameというキューからメッセージを受け取っている。
Regisのpub-subとかと異なるのは、
・subscribeのための準備処理がない(メッセージブローカー一筋! 単一用途だからな!)
・複数のmasterを起動時に指定して持てる
というあたり。
複数のmasterに対して誰かがaddjobでjobを投げて、複数のmasterに対してgetjobしてる誰かが受け取る、という仕組み。
producerとconsumerそれぞれの動作ができるよ、という感じか。
仲介として、server側で、nodeという単位でメッセージのreplicationとか保持が行われる。
んで、multicastがしたい時とかどうやればいいんだろう?
→addjobする対象( = ターゲットとなるqueue)を増やす。
なるほど。
ちょっと使って良いなーと思ったところ
client側から指定できる、node自体の溜まってる内容をチェックする仕掛けがあること。
addjob オプションの maxlen がそれ。
試しに maxlen を2とかにして複数回addjobしたら、client側がエラーを得ることができた。
これで、送信者側からキューが詰まってるかどうか楽にわかる。もちろん上位での監視は別途必要なのだけど。
機構的に、役割の割り振りをclient-serverでどうやったら最速になるか、というのを、
多重配信の可能性を残しつつも最低でも一回行う、というのを基礎に組んでいる感じ。
順の保持を完璧までは頑張らない + 障害中とかで復帰時に同じメッセージを複数回受信する可能性があり得るため、clientのやるべき事がちょっとある。
(順の組み立てに関しては諦めていいんじゃないかな~っていう頻度になるような設計に見えた。複数回のほうは何かガード要素を入れる必要がありそう。)
トレードオフでわずかなこれらを残した反面、
ある程度簡潔かつ高速になってるんじゃねーかなーという感じ。
lua client
nginx-lua-moduleから使うので、書いてる。
upstreamに対してaddjob、
このクライアントに対してのdownstreamに対してgetjobを行う。
制御用の機構として、control用のqueueに対してdownstream queue nameを知らせる必要があるっぽい。
簡単ぽい。
Unity client
こちらはC#。とある理由で使うので書いてる。
複数のdownstreamのqueueに対してaddjob投げようと思う。
upstreamのqueueからは聞きまくる。
制御用の機構としてqueueNameの登録をどっかでうけとらないといけないので、control用のqueueについても聞く。
簡単ぽい。